• 普通联动
    • addLinkage('name值', '标题', '提示', '选项', '默认值', '异步请求地址' [, '后代name值', '请求参数名', '额外表单项值'])" level="2">addLinkage('name值', '标题', '提示', '选项', '默认值', '异步请求地址' [, '后代name值', '请求参数名', '额外表单项值'])
      • 先来个栗子感受一下" level="3">先来个栗子感受一下
      • 选项" level="3">选项
      • 异步请求地址" level="3">异步请求地址
      • 后代name值" level="3">后代name值
      • 请求参数名" level="3">请求参数名
      • 额外表单项值(1.3.3+)" level="3">额外表单项值(1.3.3+)
      • 演示例子" level="3">演示例子
      • 编辑页面" level="3">编辑页面

    普通联动

    addLinkage('name值', '标题', '提示', '选项', '默认值', '异步请求地址' [, '后代name值', '请求参数名', '额外表单项值'])" class="reference-link">addLinkage('name值', '标题', '提示', '选项', '默认值', '异步请求地址' [, '后代name值', '请求参数名', '额外表单项值'])

    标识符:linkage

    版本功能
    1.3.3支持发送额外表单项值
    参数含义类型
    namename值string
    title标题string
    tips提示string
    options选项array
    default默认值string
    ajax_url异步请求地址string
    next_items后代name值string
    param请求参数名string
    extra_param额外表单项值(1.3.3+)string

    先来个栗子感受一下" class="reference-link">先来个栗子感受一下

    比如做个省份城市联动,这里最后一级是城市,没有地区。

    1. $list_province = ['gd' => '广东', 'gx' => '广西'];
    2. return ZBuilder::make('form')
    3. ->addLinkage('province', '选择省份', '', $list_province, '', url('get_city'), 'city')
    4. ->addSelect('city', '选择城市')
    5. ->fetch();

    效果:

    普通联动 - 图1

    下面,来讲解一下如何使用。

    选项" class="reference-link">选项

    比如上面的省份,“选项”是一个一维数组,和之前单选、复选等类型一样。

    异步请求地址" class="reference-link">异步请求地址

    是指选择下拉之后,去请求下级数据的地址,可以使用url函数生成或者直接写有效的url地址。

    返回的数据格式是json格式,并且里至少面要包含“code”、“msg”、“list”,其中,“code”表示状态,1表示获取成功,0表示获取失败。“msg”是提示信息,“list”是返回的列表数据。

    一个典型的数据返回例子(这个例子只是简单的演示,无论传什么值过来,都返回相同的json数据)

    1. // 根据省份获取城市
    2. public function get_city($province = '')
    3. {
    4. $arr['code'] = '1'; //判断状态
    5. $arr['msg'] = '请求成功'; //回传信息
    6. $arr['list'] = [
    7. ['key' => 'gz', 'value' => '广州'],
    8. ['key' => 'sz', 'value' => '深圳'],
    9. ]; //数据
    10. return json($arr);
    11. }

    “list”数组中,每一个数组元素需包含两个键,“key”和“value”,也可以借助format_linkage()方法将普通的一维数组转换为符合普通联动的数据结构。

    后代name值" class="reference-link">后代name值

    指子级下拉菜单的name值,比如上面的例子,省份的name值是“province”,城市的name值是city,那么需要给省份下拉菜单指定下级的name值,即city

    1. $list_province = ['gd' => '广东', 'gx' => '广西'];
    2. return ZBuilder::make('form')
    3. ->addLinkage('province', '选择省份', '', $list_province, '', url('get_city'), 'city')
    4. ->fetch();

    如果是三级联动,那么“后代name值”就必须把所有子代下拉菜单的name值都写进去,并且以英文逗号隔开,比如加多一个地区:

    1. $list_province = ['gd' => '广东', 'gx' => '广西'];
    2. return ZBuilder::make('form')
    3. ->addLinkage('province', '选择省份', '', $list_province, '', url('get_city'), 'city,area')
    4. ->addLinkage('city', '选择城市', '', '', '', url('get_area'), 'area')
    5. ->addSelect('area', '选择地区')
    6. ->fetch();

    我们可以看到,选择省份中写的是“city,area”,而选择城市写的是“area”,选择地区则没有。

    细心的朋友可能已经看出在第一个例子中,“选择城市”使用的是addSelect方法,而在这里使用的是addLinkage方法,最后一项“选择地区”用addSelect方法。

    是的,最后一项是不用去获取数据的,所以我们可以用简单的addSelect方法即可,最终效果如下:

    普通联动 - 图2

    请求参数名" class="reference-link">请求参数名

    默认情况下,选择下拉菜单后,去获取数据时会带上选中的数值,比如选择“广东”,就会给get_city方法传一个参数名为“province”,值为“gd”的参数。那么我们就可以在get_city($province = '')接收到这个参数,并查询数据库。

    在没有修改的情况下,参数名是该下拉菜单的name值,如果有需要,可以修改为其他,比如:

    1. $list_province = ['gd' => '广东', 'gx' => '广西'];
    2. return ZBuilder::make('form')
    3. ->addLinkage('province', '选择省份', '', $list_province, '', url('get_city'), 'city,area', 'sf')
    4. ->addLinkage('city', '选择城市', '', '', '', url('get_area'), 'area')
    5. ->addSelect('area', '选择地区')
    6. ->fetch();

    那么get_city方法就不能用province来接收参数值,而是用sf,如:get_city($sf = ''),当然,使用$this->request->post('sf')也是可以获取到的。

    额外表单项值(1.3.3+)" class="reference-link">额外表单项值(1.3.3+)

    以上面的代码为例子,默认情况下,当我们选择城市时,会将城市的值发送给服务器,以获取地区列表。但有时候,我们希望能同时发送表单上的其他表单项值,那么就需要配置extra_param参数。

    1. $list_province = ['gd' => '广东', 'gx' => '广西'];
    2. return ZBuilder::make('form')
    3. ->addLinkage('province', '选择省份', '', $list_province, '', url('get_city'), 'city,area', 'sf')
    4. ->addLinkage('city', '选择城市', '', '', '', url('get_area'), 'area', '', 'province')
    5. ->addSelect('area', '选择地区')
    6. ->fetch();

    上面再添加选择城市中,最后一个参数设置为了province,那么在选择城市的时候,不仅会将城市代码发送到服务器,同时还会将当前选中的省份代码也发送到服务器。

    如果需要发送表单的其他表单项,可以填写多个,以逗号隔开。

    演示例子" class="reference-link">演示例子

    1. class Index extends Admin
    2. {
    3. public function add()
    4. {
    5. // 使用ZBuilder构建表单页面,并将页面标题设置为“添加”
    6. $list_province = ['gd' => '广东', 'gx' => '广西'];
    7. return ZBuilder::make('form')
    8. ->addLinkage('province', '选择省份', '', $list_province, '', url('get_city'), 'city,area')
    9. ->addLinkage('city', '选择城市', '', '', '', url('get_area'), 'area')
    10. ->addSelect('area', '选择地区')
    11. ->fetch();
    12. }
    13. // 根据省份获取城市
    14. public function get_city($province = '')
    15. {
    16. $arr['code'] = '1'; //判断状态
    17. $arr['msg'] = '请求成功'; //回传信息
    18. $arr['list'] = [
    19. ['key' => 'gz', 'value' => '广州'],
    20. ['key' => 'sz', 'value' => '深圳'],
    21. ]; //数据
    22. return json($arr);
    23. }
    24. // 根据城市获取地区
    25. public function get_area($city = '')
    26. {
    27. $arr['code'] = '1'; //判断状态
    28. $arr['msg'] = '请求成功'; //回传信息
    29. $arr['list'] = [
    30. ['key' => 'th', 'value' => '天河'],
    31. ['key' => 'by', 'value' => '白云'],
    32. ]; //数据
    33. return json($arr);
    34. }
    35. }

    编辑页面" class="reference-link">编辑页面

    在编辑页面,普通联动的列表需要先查询出来,再赋值给各个下拉框,这样才能显示对应的值。

    1. class Index extends Admin
    2. {
    3. public function edit($id)
    4. {
    5. // 获取编辑数据
    6. $info = Db::name('...')->find();
    7. // 查询省份列表,一般是去数据库查询,这里用固定数组代替
    8. $list_province = ['gd' => '广东', 'gx' => '广西'];
    9. // 这里需要根据已经选择的省份,查询数据库获取城市列表
    10. $list_city = Db::name('city')->where('province', $info['province'])->column('id,name');
    11. // 这里需要根据已经选择的城市,查询数据库获取地区列表
    12. $list_area = Db::name('area')->where('city', $info['city'])->column('id,name');
    13. return ZBuilder::make('form')
    14. ->addLinkage('province', '选择省份', '', $list_province, '', url('get_city'), 'city,area')
    15. ->addLinkage('city', '选择城市', '', $list_city , '', url('get_area'), 'area')
    16. ->addSelect('area', '选择地区', '', $list_area)
    17. ->setFormData($info)
    18. ->fetch();
    19. }
    20. }